home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib16.dsk / APPLE TRIG.bas < prev    next >
BASIC Source File  |  2023-02-26  |  9KB  |  161 lines

  1. 10  REM     **********************
  2. 11  REM     *     APPLE TRIG     *
  3. 12  REM     *   BY ANDY WARREN   *
  4. 13  REM     * COPYRIGHT (C) 1983 *
  5. 14  REM     * BY MICROSPARC, INC *
  6. 15  REM     * LINCOLN, MA. 01773 *
  7. 16  REM     **********************
  8. 100  ONERR  GOTO 1590
  9. 180  REM  -- PROTECT HI-RES
  10. 190  REM  -- PAGE ONE:
  11. 200  IF  PEEK(103) < >45  OR  PEEK(104) < >65  THEN  POKE 103,45: POKE 104,65: POKE 16684,0: PRINT  CHR$(13) CHR$(4)"RUN APPLE TRIG"
  12. 210  REM INTRODUCTION:
  13. 220  TEXT : HOME :C$ = "*":A = 8:B = 31:C = 6:D = 17
  14. 230  GOSUB 440: VTAB 3: HTAB 8
  15. 240  INVERSE : PRINT "TRIGONOMETRIC FUNCTIONS"
  16. 250  FLASH : GOSUB 390
  17. 260  NORMAL : VTAB C +2: HTAB A +3: PRINT "CIRCULAR FUNCTIONS"
  18. 270  VTAB C +3: HTAB A +8: PRINT "VER. 2.2"
  19. 280  PRINT : HTAB A +3: PRINT "BY ANDY WARREN, 82"
  20. 290  HTAB A +3: VTAB C +7: PRINT "COPYRIGHT (C) 1983"
  21. 300  HTAB A +3: PRINT "BY MICROSPARC, INC"
  22. 310  REM 
  23. 320  HTAB A +3: PRINT "LINCOLN, MA. 01773"
  24. 330  FOR X = 1 TO 700: NEXT X
  25. 340  INVERSE : GOSUB 390
  26. 350  NORMAL : VTAB 20: HTAB 2: PRINT "WOULD YOU LIKE TO RUN THE PROGRAM NOW?";
  27. 360  GET Y$: IF Y$ < >"Y"  AND Y$ < >"N"  THEN 350
  28. 370  IF Y$ = "N"  THEN  HOME : END 
  29. 380  GOTO 490
  30. 390  HTAB A: VTAB C: FOR X = 1 TO B -A +1: PRINT C$;: NEXT : PRINT 
  31. 400  FOR Y = C TO D
  32. 410  HTAB A: PRINT C$: HTAB B: PRINT C$: VTAB Y: NEXT 
  33. 420  HTAB A: FOR X = 1 TO B -A +1: PRINT C$;: NEXT : PRINT 
  34. 430  RETURN 
  35. 440  HGR : POKE 49234,0: FOR X = 0 TO 191  STEP 2
  36. 450  HCOLOR= 3
  37. 460  HPLOT X,X TO 279 -X,X TO 279 -X,191 -X TO X,191 -X TO X,X
  38. 470  NEXT X: FOR D3 = 1 TO 1000: NEXT : TEXT : HOME : RETURN 
  39. 480  REM 
  40. 490  REM  -- MAIN PROGRAM:
  41. 500  TEXT : HOME : SPEED= 255: NORMAL 
  42. 510  VTAB 8: HTAB 15: PRINT "PLEASE WAIT"
  43. 520  REM LOAD SHAPE TABLE:
  44. 530 L = 16384
  45. 540  GOSUB 1650: POKE 232,L -256 * INT(L/256): POKE 233, INT(L/256)
  46. 550  REM 
  47. 560  GOSUB 570: GOTO 590
  48. 570  INVERSE : VTAB 23: HTAB 2: PRINT " PRESS ANY KEY TO CONTINUE ";: POKE  -16368,0: WAIT  -16384,128: NORMAL : HOME :FR =  FRE(0): RETURN 
  49. 580  REM INSTRUCTIONS:
  50. 590  VTAB 5: HTAB 5
  51. 600  PRINT "THIS PROGRAM ALLOWS YOU TO GRAPH": PRINT : PRINT "FUNCTIONS OF THE FORM": VTAB 10: HTAB 8: PRINT "F(X) = A SIN B (THETA + C) +D,"
  52. 610  VTAB 13: PRINT "WHERE A, B, C, & D ARE INPUT BY YOU, AND": PRINT "SIN MAY BE REPLACED BY": VTAB 18: HTAB 8: PRINT "COS, TAN, COTAN, SEC, OR COSEC": GOSUB 570
  53. 620  VTAB 2: INVERSE : HTAB 14: PRINT " MISCELLANIA ": NORMAL : VTAB 6: PRINT "A 'STANDARD' CURVE WILL BE PRODUCED WHEN": PRINT "A=1, B=1, C=0, AND D=0."
  54. 630  PRINT : PRINT : PRINT "(WHEN INPUTTING VALUES, SIMPLY PRESSING  <RETURN> IS EQUIVALENT TO TYPING '0'. )";
  55. 640  PRINT : PRINT "(WHEN INPUTTING A, B, C, & D, YOU MAY": PRINT " TYPE 'P' FOR PI, I.E.  1P, 2P, -3P/2)"
  56. 650  GOSUB 570
  57. 660  REM INPUT A,B,C&D:
  58. 670 FU$(1) = "SINE":FU$(2) = "TANGENT":FU$(3) = "SECANT":FU$(4) = "COSINE":FU$(5) = "COTANGENT":FU$(6) = "COSECANT"
  59. 680  HGR 
  60. 690  POKE 34,20: POKE 35,24: HOME : PRINT "F(X)=A --- B (THETA + C) + D"
  61. 700 PI = 3.1415927
  62. 710  VTAB 21: HTAB 32: INPUT "A=? ";A$
  63. 720  VTAB 22: HTAB 32: INPUT "B=? ";B$
  64. 730  VTAB 23: HTAB 32: INPUT "C=? ";C$
  65. 740  VTAB 24: HTAB 32: INPUT "D=? ";D$
  66. 750  REM ANALYZE INPUT:
  67. 760 A$ = " " +A$ +" ":B$ = " " +B$ +" ":C$ = " " +C$ +" ":D$ = " " +D$ +" ": GOSUB 1370
  68. 770  REM 
  69. 780  HOME : PRINT "A = ";A$: PRINT "B = ";B$: PRINT "C = ";C$: PRINT "D = ";D$;
  70. 790  VTAB 24: HTAB 23: PRINT "IS THIS CORRECT? ";: POKE  -16368,0: GET Q$: IF Q$ = "N"  THEN 690
  71. 800  IF Q$ < >"Y"  THEN 790
  72. 810  REM INPUT FUNCTION:
  73. 820  VTAB 24: HTAB 23: CALL  -868
  74. 830  POKE 33,17: POKE 32,23
  75. 840  HOME : PRINT "FUNCTION?": PRINT "1) SIN  4) COS": PRINT "2) TAN  5) COTAN": PRINT "3) SEC  6) COSEC";
  76. 850  VTAB 21: HTAB 34: POKE  -16368,0: GET Q$:F =  VAL(Q$): IF F <1  OR F >6  THEN 850
  77. 860  ON F GOTO 870,890,910,930,950,970
  78. 870  DEF  FN R(X) = A * SIN(B *(X +C)) +D
  79. 880  GOTO 980
  80. 890  DEF  FN R(X) = A * TAN(B *(X +C)) +D
  81. 900  GOTO 980
  82. 910  DEF  FN R(X) = A/ COS(B *(X +C)) +D
  83. 920  GOTO 980
  84. 930  DEF  FN R(X) = A * COS(B *(X +C)) +D
  85. 940  GOTO 980
  86. 950  DEF  FN R(X) = A/ TAN(B *(X +C)) +D
  87. 960  GOTO 980
  88. 970  DEF  FN R(X) = A/ SIN(B *(X +C)) +D
  89. 980  HOME : PRINT "FUNCTION:": PRINT FU$(F): VTAB 24: PRINT "IS THIS CORRECT?";: POKE  -16368,0: GET Q$
  90. 990  IF Q$ = "N"  THEN 840
  91. 1000  IF Q$ < >"Y"  THEN 980
  92. 1010  REM 
  93. 1020  POKE 32,0: POKE 33,40: POKE 34,20: POKE 35,24
  94. 1030  HOME : VTAB 22: PRINT "F(X)= "A$" "FU$(F)" "B$" (THETA + "C$") + "D$
  95. 1040  REM DRAW AXES:
  96. 1050  HCOLOR= 3: SCALE= 1: ROT= 64
  97. 1060  HPLOT 140,0 TO 140,159: HPLOT 0,80 TO 279,80
  98. 1070  FOR X = 0 TO 105  STEP 35: HPLOT X,77 TO X,83: HPLOT X +1,77 TO X +1,83: NEXT 
  99. 1080  FOR X = 174 TO 279  STEP 35: HPLOT X,77 TO X,83: HPLOT X -1,77 TO X -1,83: NEXT 
  100. 1090  FOR Y = 0 TO 159  STEP 20: HPLOT 137,Y TO 143,Y: NEXT : HPLOT 137,159 TO 143,159
  101. 1100  REM LABEL AXES:
  102. 1110  FOR Y = 1 TO 4: DRAW Y AT 130,80 -Y *20: DRAW Y AT 130,75 +Y *20: HPLOT 125,77 +Y *20 TO 127,77 +Y *20: NEXT 
  103. 1120  FOR X = 75 TO 110  STEP 35: DRAW 10 AT X,86: HPLOT X -5,88 TO X -3,88: NEXT 
  104. 1130  FOR X = 12 TO 47  STEP 35: DRAW 10 AT X,86: HPLOT X -12,88 TO X -10,88: NEXT 
  105. 1140  HPLOT 35,92 TO 51,92: HPLOT 105,92 TO 115,92
  106. 1150  DRAW 2 AT 108,94: DRAW 2 AT 42,94: DRAW 3 AT 40,86: DRAW 2 AT 5,86
  107. 1160  FOR X = 170 TO 275  STEP 35: DRAW 10 AT X,86: NEXT : DRAW 2 AT 268,86
  108. 1170  DRAW 2 AT 170,94: DRAW 2 AT 237,94: DRAW 3 AT 233,86: HPLOT 233,92 TO 245,92: HPLOT 170,92 TO 175,92
  109. 1180  REM PLOT GRAPH:
  110. 1190 ST = 4 *PI/279:P = 0:ML =  -20:AD = 80.5:MX = 159:MN = 0:M1 = 1:M2 = 160
  111. 1200  FOR X =  -2 *PI TO 2 *PI  STEP ST:FX =  INT( FN R(X) *ML +AD): IF FX < = MX  AND FX > = MN  THEN  XDRAW 12 AT P,FX
  112. 1210  IF FX = M2  THEN  XDRAW 12 AT P,MX
  113. 1220 P = P +M1: NEXT 
  114. 1230  REM 
  115. 1240 FR =  FRE(0): POKE 34,23: POKE 35,24: HOME : PRINT "DO YOU WANT ANOTHER GRAPH OVERPRINTED? ";: POKE  -16368,0: GET A$: IF A$ = "Y"  THEN 690
  116. 1250  IF A$ < >"N"  THEN 1240
  117. 1260  GOTO 680
  118. 1270  REM 
  119. 1280  REM  -- INPUT ANALYZER.
  120. 1290  REM  -- ANALYZES NUMERIC
  121. 1300  REM  -- INPUT, CONVERTING
  122. 1310  REM  -- "P" TO PI, AND
  123. 1320  REM  -- COMPUTING FRAC-
  124. 1330  REM  -- TIONS, I.E.,
  125. 1340  REM  -- "3P/2" BECOMES
  126. 1350  REM  -- (3*3.1415927)/2
  127. 1360  REM  -- = 4.712389
  128. 1370 A1 =  LEN(A$):B1 =  LEN(B$):C1 =  LEN(C$):D1 =  LEN(D$):A =  VAL(A$):B =  VAL(B$):C =  VAL(C$):D =  VAL(D$): FOR X = 1 TO A1: IF  MID$ (A$,X,1) = "P"  THEN A =  VAL( LEFT$(A$,X -1)) *PI: IF A = 0  THEN A = PI
  129. 1380  NEXT 
  130. 1390  FOR X = 1 TO A1: IF  MID$ (A$,X,1) = "/"  THEN A = A/ VAL( RIGHT$(A$,A1 -X))
  131. 1400  NEXT 
  132. 1410  FOR X = 1 TO B1: IF  MID$ (B$,X,1) = "P"  THEN B =  VAL( LEFT$(B$,X -1)) *PI: IF B = 0  THEN B = PI
  133. 1420  NEXT 
  134. 1430  FOR X = 1 TO B1: IF  MID$ (B$,X,1) = "/"  THEN B = B/ VAL( RIGHT$(B$,B1 -X))
  135. 1440  NEXT 
  136. 1450  FOR X = 1 TO C1: IF  MID$ (C$,X,1) = "P"  THEN C =  VAL( LEFT$(C$,X -1)) *PI: IF C = 0  THEN C = PI
  137. 1460  NEXT 
  138. 1470  FOR X = 1 TO C1: IF  MID$ (C$,X,1) = "/"  THEN C = C/ VAL( RIGHT$(C$,C1 -X))
  139. 1480  NEXT 
  140. 1490  FOR X = 1 TO D1: IF  MID$ (D$,X,1) = "P"  THEN D =  VAL( LEFT$(D$,X -1)) *PI: IF D = 0  THEN D = PI
  141. 1500  NEXT 
  142. 1510  FOR X = 1 TO D1: IF  MID$ (D$,X,1) = "/"  THEN D = D/ VAL( RIGHT$(D$,D1 -X))
  143. 1520  NEXT 
  144. 1530  IF   NOT (A)  THEN A$ = " 0"
  145. 1540  IF   NOT B  THEN B$ = " 0"
  146. 1550  IF   NOT C  THEN C$ = " 0"
  147. 1560  IF   NOT D  THEN D$ = " 0"
  148. 1570 A$ =  RIGHT$(A$, LEN(A$) -1):B$ =  RIGHT$(B$, LEN(B$) -1):C$ =  RIGHT$(C$, LEN(C$) -1):D$ =  RIGHT$(D$, LEN(D$) -1): RETURN 
  149. 1580  REM ERROR TRAP:
  150. 1590 Y =  PEEK(222): IF Y = 133  THEN 1220: REM  -- DIVIDE BY ZERO
  151. 1600  IF Y = 0  THEN 1240: REM        -- NEXT WITHOUT FOR
  152. 1610  IF Y = 254  OR Y = 255  THEN  PRINT  CHR$(7);: RESUME : REM  -- BAD INPUT OR CTRL-C
  153. 1620  TEXT : HOME : PRINT  CHR$(7);"ERROR #";Y; CHR$(7);" IN LINE "; PEEK(218) +256 * PEEK(219): END 
  154. 1630 :
  155. 1640  REM SHAPE TABLE MAKER:
  156. 1650 M = L: FOR X = 1 TO 3: READ B$: FOR I = 1 TO  LEN(B$)  STEP 2:AD =  ASC( MID$ (B$,I,1)) -48: IF AD >9  THEN AD = AD -7
  157. 1660 CH =  ASC( MID$ (B$,I +1,1)) -48: IF CH >9  THEN CH = CH -7
  158. 1670  POKE M,AD *16 +CH:M = M +1: NEXT : NEXT : RETURN 
  159. 1680  DATA "0F00200025002F003B0044004F0057005D00690073007C00850087008D009B0009363606002D2D363F3F362D2D05002D2D363F3F5749313F3F0700362D2D248C9233060049393F372E2D353E3F3F0036362D2D243F3F002D2D363606002D2D363F3FE492
  160. 1690  DATA "312D2D240049123F272C2D353636002D2D36361ED82424002D2D36363F3F24240006002D363F2C05002D2D3E3F372D2D3E3F372D2D050000434C3E3F3F3F3F0700242424242424242D2D2D2D2D2D2E2E363E3E3635353637373F3F3F3F3F3F41282D2D2D
  161. 1700  DATA "2D2C3C3C3C3F3F3F37364640C0282D2D2D2C2C3C3C3F3F3F3F36360500092D2D2D2D2D2C2C243F3E3E3F3F3F27272424242C2C2D2D2D35352D2427273F3F3F3F3F3E3E36363636363535002D2D2D2D2D2D2C2C242424242427273F3F3F3F3F3F36363636